今日內容:例外處理、寫檔、讀檔、小實作專案(音樂播放器)
用於應付會導致程式錯誤的行為,例如除以0、不正確的使用者輸入內容等
使用try{}, catch{}, finally{}
catch可以用來抓 "可能的已知錯誤型態"(建議),也可以抓 "任意的錯誤型態"(避免發生意外)
try{
System.out.println(1/0);
}
catch(ArithmeticException e){ // (錯誤型態 變數名(隨便宣告))
System.out.println("You can't divide by zero");
}
try{
System.out.print("Enter a number: ");
int num = scanner.nextInt();
System.out.println(num);
}
catch(InputMismatchException e){
System.out.println("That wasn't a number");
}
可以對於一個try底下有多個catch(不同的錯誤型態)
try{
System.out.print("Enter a number: ");
int num1 = scanner.nextInt();
System.out.print("Enter another number: ");
int num2 = scanner.nextInt();
System.out.println(num1/num2);
}
catch(InputMismatchException e){
System.out.println("The input wasn't a number");
}
catch(ArithmeticException e){
System.out.println("You can't divide by zero");
}
而finally{}可以用來回收資源,finally內的程式碼無論是否有錯誤發生都會執行
,可以用於關閉scanner或file
try{
Scanner scanner = new Scanner();
// scanner do something
}
catch(InputMismatchException e){
// handle error
}
// catch other errors
finally{
scanner.close();
}
常見的用法有四種(Object)
這邊教第一種(FileWriter)
import java.io.FileWriter;
import java.io.IOException;
// ...
try(FileWriter writer = new FileWriter("test.txt")){// 嘗試在本地資料夾(src)新增一個test.txt
writer.write("Hello World!");
System.out.println("File written");
}
catch(IOException e){ // 抓任意有關IO的exception (例如無法建立test.txt)
System.out.println("Could not write file");
}
也可以使用絕對路徑
("C:\\Users\\HP\\Desktop\\test.txt"); // 記得反斜線要寫兩次,因為 '\' 是跳脫字元
catch(FileNotFoundException e){ // 用來抓找不到路徑的exception
System.out.println("File location not found");
}
// 也可以用字串來儲存路徑位置或輸出內容
String filePath = "C:\\Users\\HP\\Desktop\\test.txt";
String textContent = "Hello World\nHave a great day";
// 然後對writer中傳入filePath和textContent即可
常見的用法有三種(Object)
這邊一樣教第一種
import java.io.BufferReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
// ...
String filePath = "C:\\Users\\HP\\Desktop\\test.txt"
try(BufferReader reader = new BufferReader(new FileReader(filePath))){
String line;
while((line = reader.readLine()) != null){ // 這裡的null是小寫
System.out.println(line);
}
}
catch(FileNotFoundException e){
System.out.println("Could not locate file");
}
catch(IOException e){
System.out.println("Something went wrong");
}
音檔需要用wav格式(java內建可以直接用,用mp3要用外部資料庫)
import javax.sound.sampled.*; // AudioInputStream, AudioSystem, Clip
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class MusicPlayer {
public static void main(String[] args){
String filePath = "src\\music.wav";
File file = new File(filePath);
try(Scanner scanner = new Scanner(System.in); // 這邊可以用分號分隔,一次try兩件事
AudioInputStream audioStream = AudioSystem.getAudioInputStream(file)){
Clip clip = AudioSystem.getClip();
clip.open(audioStream);
String response = "";
while(!response.equals("Q")){
System.out.println("P = play");
System.out.println("S = stop");
System.out.println("R = reset");
System.out.println("Q = quit");
System.out.print("Enter your choice: ");
response = scanner.next().toUpperCase();
switch(response){
case "P" -> clip.start();
case "S" -> clip.stop();
case "R" -> clip.setMicrosecondPosition(0);
case "Q" -> clip.close();
default -> System.out.println("Invalid choice");
}
}
}
catch(FileNotFoundException e){
System.out.println("Could not locate file");
}
catch(UnsupportedAudioFileException e){
System.out.println("Audio file is not supported");
}
catch(LineUnavailableException e){
System.out.println("Unable to access audio resource");
}
catch(IOException e){
System.out.println("Something went wrong");
}
finally{
System.out.println("Bye!");
}
}
}
今天是學習Java基本語法的第五天,學到了如何進行檔案讀寫,以及如何使用Audio以及Clip這些庫,對之後做貪食蛇的背景音樂有機會用到。
今天也是快樂學習的一天,明天繼續!